
package com.smart.interceptor;

import cn.dev33.satoken.stp.StpUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.ssssssss.magicapi.core.interceptor.RequestInterceptor;
import org.ssssssss.magicapi.core.model.ApiInfo;
import org.ssssssss.magicapi.core.model.JsonBean;
import org.ssssssss.magicapi.core.model.Options;
import org.ssssssss.magicapi.core.servlet.MagicHttpServletRequest;
import org.ssssssss.magicapi.core.servlet.MagicHttpServletResponse;
import org.ssssssss.script.MagicScriptContext;

/**
 * @author luckyboy
 */
@Component
public class SaTokenMagicRequestInterceptor implements RequestInterceptor {
    private static final Logger logger = LoggerFactory.getLogger(SaTokenMagicRequestInterceptor.class);

    @Override
    public Object preHandle(ApiInfo info, MagicScriptContext context, MagicHttpServletRequest request, MagicHttpServletResponse response) throws Exception {

        logger.info("请求接口：{}",  info.getName());

        // 打印调试信息
        String token = request.getHeader("Authorization");
        logger.info("请求头 Authorization: {}", token);
        logger.info("StpUtil.isLogin(): {}", StpUtil.isLogin());

        // 接口选项配置了需要登录
        if ("true".equals(info.getOptionValue(Options.REQUIRE_LOGIN))) {
            // 尝试手动设置 token
            if (token != null && !token.isEmpty()) {
                // 移除 Bearer 前缀
                String tokenValue = token.startsWith("Bearer ") ? token.substring(7) : token;
                try {
                    // 使用指定 token 进行验证
                    Object id=StpUtil.getLoginIdByToken(tokenValue);
                    if (id != null) {
                        logger.info("Token 验证成功，用户ID: {}", id);
                    } else {
                        logger.warn("Token 无效或用户未登录");
                        return new JsonBean<>(401, "用户未登录或 token 无效");
                    }
                } catch (Exception e) {
                    logger.error("Token 验证失败: {}", e.getMessage());
                    return new JsonBean<>(401, "用户未登录或 token 无效");
                }
            } else if (!StpUtil.isLogin()) {
                logger.warn("未找到 Authorization 请求头且 StpUtil.isLogin() 返回 false");
                return new JsonBean<>(401, "用户未登录");
            }
        }
        // 如果接口选项里有角色／权限要求，也可以通过 info.getOptionValue("role") 或 getOptionValue("permission") 等读取
        String requiredPermission = info.getOptionValue("permission");
        if (requiredPermission != null && !requiredPermission.isEmpty()) {
            if (!StpUtil.hasPermission(requiredPermission)) {
                 return new JsonBean<>(403, "用户权限不足");

            }
        }
        return null;




    }
}
